/**
    算法描述：
    核心问题：建边问题
    解决所需数据结构+算法：
**/
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;

struct loc{
    double x, y;
}rat[210], hole[210];

struct edge{
    int x, y, pre;
}a[40010];
int alen = 0, last[210] = {0};

void ins(int x, int y) {
    a[++alen] = edge{x, y, last[x]};
    last[x] = alen;
}

int n, m, s, ans = 0, match[110] = {0};//s 支持的最大距离
bool v[110] = {false};

double distance(loc a, loc b) {
    return sqrt((a.x - b.x)*(a.x - b.x) + (a.y - b.y)*(a.y - b.y));
}

void pre() {//建边
    for (int i=1; i<=n; i++) {
        for (int j=1; j<=m; j++) {
            if (distance(rat[i], hole[j]) <= s)
                ins(i, j);
        }
    }
}

bool findExist(int x) {
    for (int k=last[x]; k; k=a[k].pre) {
        int y = a[k].y;
        if (!v[y]) {
        	v[y] = true;
            if (match[y] == 0 || findExist(match[y])) {
                match[y] = x;
                return true;
            }
        }
    }
    return false;
}

int main() {
    int T, V;
    while(scanf("%d%d%d%d", &n, &m, &T, &V) != EOF) {
    	memset(match, 0, sizeof(match));
    	memset(last, 0, sizeof(last));
    	alen = 0; ans = 0;
    	
    	s = T * V;
	    for (int i=1; i<=n; i++) {
	        scanf("%lf%lf", &rat[i].x, &rat[i].y);
	    }
	    for (int i=1; i<=m; i++) {
	        scanf("%lf%lf", &hole[i].x, &hole[i].y);
	    }
	    pre();
	    for (int i=1; i<=n; i++) {
	        memset(v, false, sizeof(v));
	        if (findExist(i))
	            ans++;
	    }
	    printf("%d\n", n-ans);
	}
    return 0;
}